home *** CD-ROM | disk | FTP | other *** search
- (*************************************************************************
-
- $RCSfile: OD.mod $
- Description: The Oberon-A module definition utility
-
- Created by: fjc (Frank Copeland)
- $Revision: 1.7 $
- $Author: fjc $
- $Date: 1995/01/26 02:00:59 $
-
- Copyright © 1994-1995, Frank Copeland
- This module forms part of Oberon-A
- See Oberon-A.doc for conditions of use and distribution
-
- Log entries are at the end of the file.
-
- *************************************************************************)
-
- <* STANDARD- *>
-
- MODULE OD;
-
- IMPORT
- SYS := SYSTEM, Kernel, ODRev, Errors, e := Exec, d := Dos,
- du := DosUtil, str := Strings, s := ODStrings, u := Utility,
- wb := Workbench, i := Icon, WbConsole, ODT;
-
- CONST
- CopyrightStr = "Copyright © 1994-1995 Frank Copeland\n";
- maxPath = 255;
-
- TYPE
- PathStr = ARRAY maxPath + 1 OF CHAR;
-
- VAR
- startDir : d.FileLockPtr;
- progName : PathStr;
-
-
- (*
- ** Command line template and parsing
- *)
-
- CONST
- template =
- "FILE/A,MAKEICONS/S,NOICONS/S,"
- "TO/K,EXTERNAL/S,SIZE/S,EXPAND/S";
-
- helpStr =
- "See OD.doc for more details\n\n"
- "Arguments ? ";
-
- optFILE = 0;
- optMAKEICONS = 1;
- optNOICONS = 2;
- optTO = 3;
- optEXTERNAL = 4;
- optSIZE = 5;
- optEXPAND = 6;
- optCount = 7;
-
- VAR
- rdArgs : d.RDArgsPtr;
- args : ARRAY optCount OF SYS.LONGWORD;
-
- (* These are filled in by ParseArgs() *)
-
- VAR
- pattern, toDir : e.LSTRPTR;
- MakeIcons : BOOLEAN;
-
-
- (*
- ** Icon types
- *)
-
- CONST
- iconFile = 0;
-
-
- (*
- ** Console I/O
- *)
-
- (*------------------------------------*)
- PROCEDURE OutStr ( string : ARRAY OF CHAR );
- <*$CopyArrays-*>
- BEGIN (* OutStr *)
- du.HaltIfBreak ({d.ctrlC});
- IF d.PutStr (string) = 0 THEN END;
- END OutStr;
-
-
- (*------------------------------------*)
- PROCEDURE OutChar ( c : CHAR );
- BEGIN (* OutChar *)
- du.HaltIfBreak ({d.ctrlC});
- d.PrintF ("%lc", c)
- END OutChar;
-
-
- (*------------------------------------*)
- PROCEDURE OutLn;
- BEGIN (* OutLn *)
- OutChar ("\n")
- END OutLn;
-
-
- (*------------------------------------*)
- PROCEDURE OutStr0 ( n : LONGINT );
- VAR string : e.LSTRPTR;
- BEGIN (* OutStr0 *)
- du.HaltIfBreak ({d.ctrlC});
- string := s.GetString (n);
- IF d.PutStr (string^) = 0 THEN END;
- END OutStr0;
-
-
- (*------------------------------------*)
- PROCEDURE OutStr1 ( n : LONGINT; string : ARRAY OF CHAR );
- VAR format : e.LSTRPTR;
- <*$CopyArrays-*>
- BEGIN (* OutStr1 *)
- du.HaltIfBreak ({d.ctrlC});
- format := s.GetString (n);
- d.PrintF (format^, SYS.ADR (string));
- END OutStr1;
-
-
- (*------------------------------------*)
- PROCEDURE OutBool ( b : BOOLEAN );
- BEGIN (* OutBool *)
- IF b THEN OutStr ("TRUE")
- ELSE OutStr ("FALSE")
- END
- END OutBool;
-
-
- (*------------------------------------*)
- PROCEDURE* Cleanup (VAR rc : LONGINT);
- VAR oldDir : d.FileLockPtr;
- BEGIN (* Cleanup *)
- IF rdArgs # NIL THEN
- d.FreeArgs (rdArgs);
- d.FreeDosObject (d.rdArgs, rdArgs);
- rdArgs := NIL
- END;
- s.CloseCatalog();
- IF Kernel.fromWorkbench THEN oldDir := d.CurrentDir (startDir) END
- END Cleanup;
-
- (*------------------------------------*)
- PROCEDURE Init ();
-
- BEGIN (* Init *)
- Kernel.SetCleanup (Cleanup);
- s.OpenCatalog (NIL, "");
- rdArgs := d.AllocDosObjectTags (d.rdArgs, u.end);
- rdArgs.extHelp := SYS.ADR (helpStr);
- END Init;
-
- (*------------------------------------*)
- PROCEDURE CloneStr ( oldStr : e.LSTRPTR ) : e.LSTRPTR;
- VAR newStr : e.LSTRPTR;
- BEGIN (* CloneStr *)
- SYS.NEW (newStr, str.Length (oldStr^) + 1);
- COPY (oldStr^, newStr^);
- RETURN newStr
- END CloneStr;
-
- (*------------------------------------*)
- PROCEDURE ParseArgs ();
-
- VAR
- string : e.LSTRPTR; ignore : BOOLEAN;
- makeicons, noicons : BOOLEAN;
-
- BEGIN (* ParseArgs *)
- pattern := SYS.VAL (e.LSTRPTR, args [optFILE]);
-
- makeicons := (SYS.VAL (LONGINT, args [optMAKEICONS]) # 0);
- noicons := (SYS.VAL (LONGINT, args [optNOICONS]) # 0);
- IF makeicons & noicons THEN OutStr0 (s.errMakeIcons); HALT (d.warn)
- ELSIF makeicons THEN MakeIcons := TRUE
- ELSIF noicons THEN MakeIcons := FALSE
- END;
-
- toDir := SYS.VAL (e.LSTRPTR, args [optTO]);
- ODT.external := (SYS.VAL (LONGINT, args [optEXTERNAL]) # 0);
- ODT.size := (SYS.VAL (LONGINT, args [optSIZE]) # 0);
- ODT.expand := (SYS.VAL (LONGINT, args [optEXPAND]) # 0);
- END ParseArgs;
-
- (*------------------------------------*)
- PROCEDURE MakeIcon ( file : ARRAY OF CHAR );
-
- VAR
- icon : PathStr;
- diskObj : wb.DiskObjectPtr;
-
- <*$CopyArrays-*>
- BEGIN (* MakeIcon *)
- IF MakeIcons THEN
- ASSERT (i.base # NIL, 100);
- COPY (file, icon); str.Append (".info", icon);
- IF ~du.FileExists (icon) THEN
- diskObj := i.GetDiskObject ("ENV:OD/def_file");
- IF diskObj = NIL THEN diskObj := i.GetDefDiskObject (wb.project) END;
- IF diskObj # NIL THEN
- diskObj.currentX := wb.noIconPosition;
- diskObj.currentY := wb.noIconPosition;
- IF ~i.PutDiskObject (file, diskObj) THEN
- IF d.PrintFault (d.IoErr(), "PutDiskObject") THEN END;
- OutStr1 (s.errIcon1, file)
- END;
- i.FreeDiskObject (diskObj)
- ELSE
- IF d.PrintFault (d.IoErr(), "GetDiskObject") THEN END;
- OutStr0 (s.errIcon2)
- END
- END
- END
- END MakeIcon;
-
-
- (*------------------------------------*)
- PROCEDURE Main ();
-
- VAR
- myAnchor : d.AnchorPathPtr;
- result : LONGINT;
-
- (*------------------------------------*)
- PROCEDURE WbArgs ();
-
- VAR
- wbStartup : wb.WBStartupPtr;
- numArgs : LONGINT;
- argList : wb.WBArgumentsPtr;
- oldDir : d.FileLockPtr;
- diskObj : wb.DiskObjectPtr;
- toolTypes : wb.ToolTypePtr;
- string : e.LSTRPTR;
-
- BEGIN (* WbArgs *)
- ASSERT (i.base # NIL, 100);
-
- wbStartup := SYS.VAL (wb.WBStartupPtr, Kernel.WBenchMsg);
- numArgs := wbStartup.numArgs;
- argList := wbStartup.argList;
- IF numArgs > 2 THEN OutStr0 (s.errArgs1); HALT (d.warn) END;
-
- COPY (argList [0].name^, progName);
- startDir := d.CurrentDir (argList[0].lock);
-
- diskObj := i.GetDiskObject (progName);
- IF diskObj # NIL THEN
- toolTypes := diskObj.toolTypes;
-
- string := i.FindToolType (toolTypes, "FILE");
- IF string # NIL THEN args [optFILE] := CloneStr (string) END;
- string := i.FindToolType (toolTypes, "MAKEICONS");
- IF string # NIL THEN args [optMAKEICONS] := TRUE END;
- string := i.FindToolType (toolTypes, "NOICONS");
- IF string # NIL THEN args [optNOICONS] := TRUE END;
- string := i.FindToolType (toolTypes, "TO");
- IF string # NIL THEN args [optTO] := CloneStr (string) END;
- string := i.FindToolType (toolTypes, "SIZE");
- IF string # NIL THEN args [optSIZE] := TRUE END;
- string := i.FindToolType (toolTypes, "EXTERNAL");
- IF string # NIL THEN args [optEXTERNAL] := TRUE END;
- string := i.FindToolType (toolTypes, "EXPAND");
- IF string # NIL THEN args [optEXPAND] := TRUE END;
-
- i.FreeDiskObject (diskObj)
- END;
-
- oldDir := d.CurrentDir (argList[numArgs-1].lock);
- IF SYS.VAL (LONGINT, args [optFILE]) = 0 THEN
- IF numArgs = 2 THEN args [optFILE] := argList[numArgs-1].name
- ELSE OutStr0 (s.errArgs2); HALT (d.warn)
- END
- END
- END WbArgs;
-
-
- (*------------------------------------*)
- PROCEDURE ShellArgs ();
- BEGIN (* ShellArgs *)
- ASSERT (d.GetProgramName (progName, LEN (progName)));
- IF d.OldReadArgs (template, args, rdArgs) = NIL THEN
- ASSERT (d.PrintFault (d.IoErr(), "ReadArgs"));
- HALT (d.warn)
- END
- END ShellArgs;
-
-
- (*------------------------------------*)
- PROCEDURE Process ( file : ARRAY OF CHAR );
- VAR modName : ARRAY 32 OF CHAR; fileName : ARRAY 256 OF CHAR;
- <*$CopyArrays-*>
- BEGIN (* Process *)
- ODT.Init ();
- IF ODT.Import (file, modName) THEN
- IF toDir # NIL THEN COPY (toDir^, fileName)
- ELSE fileName := ""
- END;
- IF d.AddPart (fileName, modName, LEN (fileName)) THEN
- str.Append (".Def", fileName);
- ODT.Export (fileName, modName);
- MakeIcon (fileName)
- ELSE
- OutStr0 (s.errFileName); HALT (d.error)
- END;
- ELSE
- HALT (d.error)
- END;
- ODT.Close ();
- Kernel.GC
- END Process;
-
-
- BEGIN (* Main *)
- OutStr (ODRev.vString);
- OutStr (CopyrightStr);
- OutStr0 (s.usage);
- OutLn;
-
- IF Kernel.fromWorkbench THEN WbArgs()
- ELSE ShellArgs()
- END;
- ParseArgs();
-
- NEW (myAnchor); myAnchor.strlen := SHORT (LEN (myAnchor.buf));
- result := d.MatchFirst (pattern^, myAnchor^);
- WHILE result = 0 DO
- Process (myAnchor.buf);
- result := d.MatchNext (myAnchor^)
- END;
- d.MatchEnd (myAnchor^)
- END Main;
-
- BEGIN (* OD *)
- ASSERT (e.SysBase.libNode.version >= 37);
- Errors.Init;
-
- Init ();
- Main ()
- END OD.
-
- (***************************************************************************
-
- $Log: OD.mod $
- Revision 1.7 1995/01/26 02:00:59 fjc
- - Release 1.5
-
- ***************************************************************************)
-